package cn.bob.system.service.impl;

import cn.bob.basic.query.BaseQuery;
import cn.bob.basic.utils.PageList;
import cn.bob.system.domain.Menu;
import cn.bob.system.domain.Role;
import cn.bob.system.mapper.MenuMapper;
import cn.bob.system.mapper.RoleMapper;
import cn.bob.system.service.IRoleService;
import cn.bob.basic.service.impl.BaseServiceImpl;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Update;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author bob
 * @since 2022-10-24
 */
@Service
public class RoleServiceImpl extends BaseServiceImpl<Role> implements IRoleService {
    @Autowired
    private RoleMapper roleMapper;

    @Autowired
    private MenuMapper menuMapper;

    /**
     * 重写add方法向中间表添加数据
     * */
    @Override
    public void add(Role role) {
        super.add(role);
        //向菜单表添加数据
        //中间表的数据是一对多的 一个角色多个权限  向角色菜单中间表添加数据
        //添加中间表数据
        roleMapper.addMenuMidden(role.getId(), role.getMenus());
        roleMapper.addPerMidden(role.getId(),role.getPermissions());
    }

    /**
     * 修改中间表数据
     * @param role
     */
    @Override
    public void update(Role role) {
        super.update(role);
        //方式 1 求交集将并集数据中保留将新的添加进去
        //查找所有集合


        //方式 2 删除所有再添加
        roleMapper.delMenuMidden(role.getId());
        roleMapper.delPerMidden(role.getId());

        //添加中间表数据
        roleMapper.addMenuMidden(role.getId(), role.getMenus());
        roleMapper.addPerMidden(role.getId(),role.getPermissions());

    }

    /**
     * 删除中间表数据
     * @param id
     */
    @Override
    public void delById(Long id) {
        super.delById(id);

        roleMapper.delMenuMidden(id);
        roleMapper.delPerMidden(id);
    }

    /**
     * 批量删除
     * @param ids
     */
    @Override
    public void batchDel(List<Long> ids) {
        super.batchDel(ids);

        roleMapper.batchDelMenuMidden(ids);
        roleMapper.batchDelPerMidden(ids);
    }

    /**
     * 回显权限和菜单
     */
    @Override
    public PageList<Role> queryByPage(BaseQuery query) {
        //获取到所有role数据
        PageList<Role> rolePageList = super.queryByPage(query);
        List<Role> roles = rolePageList.getRows();
        //通过roleid获取所有的permission的id     getMiddenPId()
        for (Role role : roles) {
           List<Long> pId= roleMapper.getMiddenPId(role.getId());
           role.setPermissions(pId);
        }

        //通过roleid获取所有的permission的id     getMiddenPId()
        for (Role role : roles) {
            //通过roleid获取所有的menu数据
            //通过roleid获取所有的menu的id
            List<Menu> menus=menuMapper.getMiddenMenuId(role.getId());

            role.setOwnMenus(menus);
        }

        return new PageList<>(roles,rolePageList.getTotal());
    }
}
